package com.zhixi.service.impl;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.zhixi.entity.Generator;
import com.zhixi.service.GeneratorService;
import org.springframework.stereotype.Service;

/**
 * @作者 ShuHaoNan
 * @邮箱 shuhaonan1@gmail.com
 * @时间 2020/11/9 16:19
 */
@Service
public class GeneratorServiceImpl implements GeneratorService {

    public void codeGenerator(Generator generator) {
        // 1、创建代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 2、全局配置
        GlobalConfig gc = new GlobalConfig();
        gc.setOutputDir(generator.getPath());
        gc.setAuthor(generator.getAuthor()); //作者
        gc.setOpen(false); //生成后是否打开资源管理器
        gc.setFileOverride(false); //重新生成时文件是否覆盖
        gc.setServiceName("%sService");	//去掉Service接口的首字母I
        /* 判断主键生成策略 */
        if ("0".equals(generator.getIdType())) {
            gc.setIdType(IdType.AUTO); //主键策略
        } else if ("1".equals(generator.getIdType())) {
            gc.setIdType(IdType.NONE); //主键策略
        } else if ("2".equals(generator.getIdType())) {
            gc.setIdType(IdType.INPUT); //主键策略
        } else if ("3".equals(generator.getIdType())) {
            gc.setIdType(IdType.ID_WORKER); //主键策略
        } else if ("4".equals(generator.getIdType())) {
            gc.setIdType(IdType.UUID); //主键策略
        } else if ("5".equals(generator.getIdType())) {
            gc.setIdType(IdType.ID_WORKER_STR); //主键策略
        }
        gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型
        gc.setSwagger2(generator.isSwagger2());//开启Swagger2模式

        mpg.setGlobalConfig(gc);

        // 3、数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://" + generator.getAddressIP() + ":" + generator.getPort() + "/" + generator.getDataSourceName() + "?serverTimezone=GMT%2B8");
        dsc.setDriverName(generator.getDriverName());
        dsc.setUsername(generator.getUsername());
        dsc.setPassword(generator.getPassword());
        dsc.setDbType(DbType.MYSQL);
        mpg.setDataSource(dsc);

        // 4、包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(generator.getModuleName());// 模块名
        pc.setParent(generator.getParent());

        // 包名 com.ml.eduservice.controller
        pc.setController("controller");
        // 包名 com.ml.eduservice.entity
        pc.setEntity("entity");
        // 包名 com.ml.eduservice.service
        pc.setService("service");
        // 包名 com.ml.eduservice.mapper
        pc.setMapper("mapper");
        mpg.setPackageInfo(pc);

        // 5、策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setInclude(generator.getInclude());
        strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略
        strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀

        strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略
        strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作

        strategy.setRestControllerStyle(true); //restful api风格控制器
        strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符

        mpg.setStrategy(strategy);


        // 6、执行
        mpg.execute();
    }

}
